//============================================================================
// Name        : bmide.cpp
// Author      : Harry
// Version     : 0001
// Copyright   : harry@harrylen.cn
// Description : BMIDE in C++, Ansi-style
//============================================================================
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
/**
 * 对话框--关于
 */
void show_about(GtkWidget *widget, gpointer data)
{

  GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file("bmide.png", NULL);

  GtkWidget *dialog = gtk_about_dialog_new();
  gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog), "北冥单片机集成开发环境");
  gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "0001");
  gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog),
      "(c) 刘焕银");
  gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog),
     "BMIDE是一个简单的单片机集成开发环境。");
  gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog),
      "http://www.harryleo.cn");
  gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog), pixbuf);
  g_object_unref(pixbuf), pixbuf = NULL;
  gtk_dialog_run(GTK_DIALOG (dialog));
  gtk_widget_destroy(dialog);

}


/**
 * 图标
 */
GdkPixbuf *create_pixbuf(const gchar * filename)
{
   GdkPixbuf *pixbuf;
   GError *error = NULL;
   pixbuf = gdk_pixbuf_new_from_file(filename, &error);
   if(!pixbuf) {
      fprintf(stderr, "%s\n", error->message);
      g_error_free(error);
   }

   return pixbuf;
}

/**
 * 状态栏
 */
void toggle_statusbar(GtkWidget *widget, gpointer statusbar)
{
  if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
    gtk_widget_show(statusbar);
  } else {
    gtk_widget_hide(statusbar);
  }
}


/* 这是一个回调函数。data 参数在本示例中被忽略。
 * 后面有更多的回调函数示例。*/
void hello( GtkWidget *widget,
            gpointer   data )
{
    g_print ("Hello World\n");
}

gint delete_event( GtkWidget *widget,
                   GdkEvent  *event,
		   gpointer   data )
{
    /* 如果你的 "delete_event" 信号处理函数返回 FALSE，GTK 会发出 "destroy" 信号。
     * 返回 TRUE，你不希望关闭窗口。
     * 当你想弹出“你确定要退出吗?”对话框时它很有用。*/

    /*g_print ("delete event occurred\n");*/

    /* 改 TRUE 为 FALSE 程序会关闭。*/

    return FALSE;
}

/* 另一个回调函数 */
void destroy( GtkWidget *widget,
              gpointer   data )
{
    gtk_main_quit ();
}

int main( int   argc,
          char *argv[] )
{
    /* GtkWidget 是构件的存储类型 */
    GtkWidget *window;
    GtkWidget *vbox;

    GtkWidget *menubar;
    GtkWidget *filemenu;
    GtkWidget *file;
    GtkWidget *new;
    GtkWidget *open;
    GtkWidget *save;
    GtkWidget *saveas;
    GtkWidget *quit;

    GtkWidget *editmenu;
    GtkWidget *edit;
    GtkWidget *undo;
    GtkWidget *redo;

    /*GtkWidget *about;*/
    GdkPixbuf *logo;


    GtkWidget *sep;

	GtkWidget *toolbar;
	GtkToolItem *new1;
    GtkToolItem *open1;
    GtkToolItem *save1;
	GtkToolItem *sep1;
	GtkToolItem *exit;



    GtkWidget *statusbar;
    GtkAccelGroup *accel_group = NULL;

    /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
    gtk_init (&argc, &argv);

    /* 创建一个新窗口 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "北冥单片机集成开发系统www.harryleo.cn");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600 );
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("bmide.png"));
/**
 * 菜单条
 */
    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    menubar = gtk_menu_bar_new();
    filemenu = gtk_menu_new();
    editmenu = gtk_menu_new();

    accel_group = gtk_accel_group_new();
    gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);

    file = gtk_menu_item_new_with_mnemonic("文件(_F)");
    new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL);
    open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
    save = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE, NULL);
    saveas = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE_AS, NULL);
    sep = gtk_separator_menu_item_new();
    quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group);
    gtk_widget_add_accelerator(quit, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);

    edit = gtk_menu_item_new_with_mnemonic("编辑(_E)");
    undo = gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDO, NULL);
    redo = gtk_image_menu_item_new_from_stock(GTK_STOCK_REDO, NULL);


    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), new);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), saveas);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), sep);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit), editmenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(editmenu), undo);
    gtk_menu_shell_append(GTK_MENU_SHELL(editmenu), redo);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), edit);

    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
/**
 * 工具条
 */
    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);

    gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);

    new1 = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new1, -1);

    open1 = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), open1, -1);

    save1 = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), save1, -1);

    sep1 = gtk_separator_tool_item_new();
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep1, -1);

    exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1);

    gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);

    g_signal_connect(G_OBJECT(exit), "clicked",
          G_CALLBACK(gtk_main_quit), NULL);

    g_signal_connect_swapped(G_OBJECT(window), "destroy",
          G_CALLBACK(gtk_main_quit), NULL);
/**
 * 关于
 */
    gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);

    logo = gtk_image_get_pixbuf(GTK_IMAGE(
        gtk_image_new_from_file("bmide.png")));

    g_signal_connect(G_OBJECT(window), "button-press-event",
          G_CALLBACK(show_about), (gpointer) window);

    g_signal_connect_swapped(G_OBJECT(window), "destroy",
          G_CALLBACK(gtk_main_quit), G_OBJECT(window));



/**
 * 状态条
 */
    statusbar = gtk_statusbar_new();
    gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);


    /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出，通常是“关闭”
     * 选项或是标题栏上的关闭按钮发出的)，我们让它调用在前面定义的 delete_event() 函数。
     * 传给回调函数的 data 参数值是 NULL，它会被回调函数忽略。*/
    g_signal_connect (G_OBJECT (window), "delete_event",
		      G_CALLBACK (delete_event), NULL);

    /* 在这里我们连接 "destroy" 事件到一个信号处理函数。
     * 对这个窗口调用 gtk_widget_destroy() 函数或在 "delete_event" 回调函数中返回 FALSE 值
     * 都会触发这个事件。*/
    g_signal_connect (G_OBJECT (window), "destroy",
		      G_CALLBACK (destroy), NULL);

    /* 设置窗口边框的宽度。*/
    gtk_container_set_border_width (GTK_CONTAINER (window), 1);


    /* 最后一步是显示新创建的状态栏、工具栏和窗口 */
    gtk_widget_show_all(window);

    /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
     * 等待事件 (如键盘事件或鼠标事件) 的发生。*/
    gtk_main ();

    return 0;
}
